
// ## 2023/12/7 # 铃 # 保留之前的设计思路,重构 ##
// ## 2023/05/7 # 铃 # 重新排版.整理部分函数,修正部分数值,修复bug ##
// ## 2022/03/22 # 123 # 砍伐和种植 ##
// ## 2022/03/21 # 123 # 垒石和采矿 ##
namespace 部队_采集类计略
{
	// ================ CUSTOMIZE ================


	// =========================================
	class Main
	{
		Main()
		{ // 添加附带菜单
			add_menu_unit_order();
		}
		pk::unit @src_unit;
		pk::point src_pos_;
		pk::unit @src_unit_debate;
		pk::list<pk::unit @> unit_debate_list;
		int debate_result;

		void add_menu_unit_order()
		{
			pk::menu_item 菜单_砍伐;
			菜单_砍伐.menu = 115;
			菜单_砍伐.init = pk::unit_menu_item_init_t(init);
			菜单_砍伐.get_text = pk::menu_item_get_text_t(getText_菜单_砍伐);
			菜单_砍伐.get_desc = pk::menu_item_get_desc_t(getDesc_菜单_砍伐);
			菜单_砍伐.is_enabled = pk::menu_item_is_enabled_t(isEnabled_菜单_砍伐);
			菜单_砍伐.get_targets = pk::unit_menu_item_get_targets_t(getTargets_菜单_砍伐);
			菜单_砍伐.get_chance = pk::unit_menu_item_get_chance_t(getChance_100);
			菜单_砍伐.handler = pk::unit_menu_item_handler_t(handler_菜单_砍伐);
			pk::add_menu_item(菜单_砍伐);

			pk::menu_item 菜单_捕鱼;
			菜单_捕鱼.menu = 115;
			菜单_捕鱼.init = pk::unit_menu_item_init_t(init);
			菜单_捕鱼.get_text = pk::menu_item_get_text_t(getText_菜单_捕鱼);
			菜单_捕鱼.get_desc = pk::menu_item_get_desc_t(getDesc_菜单_捕鱼);
			菜单_捕鱼.is_enabled = pk::menu_item_is_enabled_t(isEnabled_菜单_捕鱼);
			菜单_捕鱼.get_targets = pk::unit_menu_item_get_targets_t(getTargets_菜单_捕鱼);
			菜单_捕鱼.get_chance = pk::unit_menu_item_get_chance_t(getChance_100);
			菜单_捕鱼.handler = pk::unit_menu_item_handler_t(handler_菜单_捕鱼);
			pk::add_menu_item(菜单_捕鱼);
		}
		void init(pk::unit @unit, pk::point src_pos)
		{
			@src_unit = @unit;
			src_pos_ = src_pos;
		}
		int getChance_100(pk::point dst_pos)
		{
			return 100;
		}
		// 搜索周围的敌人部队，敌人的建筑数量
		int enemies_around(pk::point pos)
		{
			int count_enemy = 0;
			int max_range = 5;
			pk::array<pk::point> range = pk::range(pos, 1, max_range);
			for (int i = 0; i < int(range.length); i++)
			{
				pk::unit @unit_around = pk::get_unit(range[i]);
				if (unit_around !is null and pk::is_enemy(src_unit, unit_around))
					count_enemy += 1;
				pk::building @building_around = pk::get_building(range[i]);
				if (building_around !is null and pk::is_enemy(src_unit, building_around))
					count_enemy += 1;

				//pk::trace(pk::format("{},{},对象{}", range[i].x, range[i].y, count_enemy));

			}
			return count_enemy;
		}

		// 砍伐
		string getText_菜单_砍伐()
		{
			return pk::encode("砍伐（10）");
		}

		bool isVisible_菜单_砍伐()
		{
			if (pk::is_campaign())
				return false;
			return true;
		}

		string getDesc_菜单_砍伐()
		{
			if (src_unit.troops < 2000)
				return pk::encode("兵力需 2000 以上");
			else if (src_unit.food < 500)
				return pk::encode("粮草需 500 以上");
			else if (src_unit.energy < 20)
				return pk::encode("气力需 20 以上");
			else if (src_unit.type == 部队类型_运输)
				return pk::encode("运输部队无法执行");
			else if (enemies_around(src_pos_) >= 1)
				return pk::encode("因为周围有敌军,所以无法执行");
			else if (getTargets_菜单_砍伐().length == 0)
				return pk::encode("没有树木可以砍伐");
			else
				return pk::encode("进行砍伐");
		}

		bool isEnabled_菜单_砍伐()
		{
			if (src_unit.troops < 2000)
				return false;
			else if (src_unit.food < 500)
				return false;
			else if (src_unit.energy < 20)
				return false;
			else if (src_unit.type == 部队类型_运输)
				return false;
			else if (enemies_around(src_pos_) >= 1)
				return false;
			else if (getTargets_菜单_砍伐().length == 0)
				return false;
			else
				return true;
		}

		bool 可否砍伐(pk::point dst_pos)
		{
			pk::building @dst_building = pk::get_building(dst_pos);
			if (dst_building !is null)
				return false;
			pk::hex @hex = pk::get_hex(dst_pos);
			if (hex.terrain == 地形_森 and pk::get_model_id(dst_pos) >= 46 and pk::get_model_id(dst_pos) <= 61)
				return true;
			else
				return false;
		}

		pk::array<pk::point_int> getTargets_菜单_砍伐()
		{
			pk::array<pk::point_int> target_units;
			auto range = pk::range(src_pos_, 1, 1);
			for (int i = 0; i < int(range.length); i++)
			{
				if (可否砍伐(range[i]))
				{
					target_units.insertLast(pk::point_int(range[i], 1));
				}
			}
			return target_units;
		}
		bool handler_菜单_砍伐(pk::point dst_pos)
		{
			pk::say(pk::encode("努力干活!"), pk::get_person(src_unit.leader));

			int 收获金 = src_unit.troops / 100 + src_unit.energy / 3 + pk::rand(100);

			if (pk::rand(100) < 8 and (pk::get_person(src_unit.leader).skill != 特技_祈愿 and pk::get_person(src_unit.leader).skill != 特技_风水))
			{
				pk::message_box(pk::encode("过度砍伐发生火灾了."));

				pk::create_fire(dst_pos, 1 + pk::rand(2), null, false);
				pk::create_fire(src_pos_, 1 + pk::rand(22), null, false);
				// if地形污染
				pk::get_person(src_unit.leader).shoubyou = 伤病_轻症;
				src_unit.status = 部队状态_中毒;

				pk::message_box(pk::encode("将领受伤了,砍伐获取金币也减少了."));

				收获金 = 收获金 / 3;
			}

			pk::add_gold(src_unit, 收获金, true);
			pk::add_energy(src_unit, -20, true);
			pk::get_person(src_unit.leader).action_done = true;
			pk::get_person(src_unit.leader).update();


			if (pk::rand(10) > 8) pk::say(pk::encode("砍些柴卖给农户换些军费吧."), pk::get_person(src_unit.leader));
			else if (pk::rand(10) > 5) pk::say(pk::encode("今天砍柴收益颇丰呀!"), pk::get_person(src_unit.leader));

			src_unit.action_done = true;
			if (int(pk::option["San11Option.EnableInfiniteAction"]) != 0)
				src_unit.action_done = false;
			return true;
		}

		// 捕鱼
		string
			getText_菜单_捕鱼()
		{
			return pk::encode("捕鱼（10）");
		}

		bool isVisible_菜单_捕鱼()
		{
			if (pk::is_campaign())
				return false;
			return true;
		}

		string getDesc_菜单_捕鱼()
		{
			if (src_unit.troops < 2000)
				return pk::encode("兵力需 2000 以上");
			else if (getTargets_菜单_捕鱼().length == 0)
				return pk::encode("范围内没有水源");
			else if (src_unit.gold < 100)
				return pk::encode("资金需 100 以上");
			else if (src_unit.energy < 20)
				return pk::encode("气力需 20 以上");
			else if (src_unit.type == 部队类型_运输)
				return pk::encode("运输部队无法执行");
			return pk::encode("进行捕鱼");
		}

		bool isEnabled_菜单_捕鱼()
		{
			if (src_unit.troops < 2000)
				return false;
			else if (getTargets_菜单_捕鱼().length == 0)
				return false;
			else if (src_unit.gold < 100)
				return false;
			else if (src_unit.type == 部队类型_运输)
				return false;
			else if (src_unit.energy < 20)
				return false;
			return true;
		}

		bool 可否捕鱼(pk::point dst_pos)
		{
			auto dst_unit = pk::get_unit(dst_pos);
			if (dst_unit !is null)
				return false;
			auto dst_building = pk::get_building(dst_pos);
			if (dst_building !is null)
				return false;
			pk::hex @hex = pk::get_hex(dst_pos);
			if (hex.terrain == 地形_河 or hex.terrain == 地形_海)
				return true;
			else
				return false;
		}

		pk::array<pk::point_int> getTargets_菜单_捕鱼()
		{
			pk::array<pk::point_int> target_units;
			auto range = pk::range(src_pos_, 1, 1);
			for (int i = 0; i < int(range.length); i++)
			{
				if (可否捕鱼(range[i])) // 能捕鱼，不是军事建筑，不是障碍，不是固定建筑
				{
					target_units.insertLast(pk::point_int(range[i], 1));
				}
			}
			return target_units;
		}

		bool handler_菜单_捕鱼(pk::point dst_pos)
		{
			

			//用来留下记号,解决水流问题
			src_unit.stock[10].amount = 0;

			if (pk::rand(100) < 8 and (pk::get_person(src_unit.leader).skill != 特技_祈愿 and pk::get_person(src_unit.leader).skill != 特技_风水 and pk::get_person(src_unit.leader).skill != 特技_威压))
			{
				pk::message_box(pk::encode("过度捕鱼，引起渔民不满，有渔民带头反抗."));
				auto range2 = pk::range(dst_pos, 1, 6);
				for (int i = 0; i < int(range2.length); i++)
				{
					auto dst_pos2 = range2[i];
					pk::hex @hex = pk::get_hex(dst_pos2);
					if ((hex.terrain == 地形_湿地 or hex.terrain == 地形_草地) and !hex.has_building and !hex.has_unit and pk::get_building(pk::get_building_id(dst_pos2)).get_force_id() == src_unit.get_force_id())
					{
						pk::complete(pk::create_building(pk::get_facility(设施_根据地1), dst_pos2, 46));
						break;
					}
				}
			}

			int 获得粮 = src_unit.troops / 15 + src_unit.energy * 3 + pk::rand(500);
			if (pk::get_hex(dst_pos).terrain == 地形_海) 获得粮 = 获得粮 * 3 / 2;

			pk::add_food(src_unit, 获得粮, true);
			pk::add_energy(src_unit, -20, true);
			pk::get_person(src_unit.leader).action_done = true;
			pk::get_person(src_unit.leader).update();

			if (pk::get_hex(dst_pos).terrain == 地形_海 and pk::rand(10) > 3) pk::say(pk::encode("海里的鱼又大又肥!"), pk::get_person(src_unit.leader));
			else if (pk::get_hex(dst_pos).terrain == 地形_河 and pk::rand(10) > 5) pk::say(pk::encode("今天收获颇丰!"), pk::get_person(src_unit.leader));
			else pk::say(pk::encode("努力干活!"), pk::get_person(src_unit.leader));
			src_unit.stock[10].amount = 3;
			src_unit.action_done = true;
			if (int(pk::option["San11Option.EnableInfiniteAction"]) != 0)
				src_unit.action_done = false;

			return true;
		}

	} Main main;
}